jetcrab\parser\literals/
array.rs

1use crate::ast::{ArrayLiteral, Node, SpreadElement};
2use crate::lexer::TokenKind;
3use crate::parser::error::ParseResult;
4use crate::parser::Parser;
5
6impl Parser {
7    pub fn parse_array_literal(&mut self) -> ParseResult<Node> {
8        self.advance();
9
10        let mut elements = Vec::new();
11
12        while !self.check(TokenKind::RightBracket) && !self.is_eof() {
13            if self.check(TokenKind::Comma) {
14                elements.push(None);
15                self.advance();
16            } else if self.check(TokenKind::Spread) {
17                self.advance();
18                let argument = Box::new(self.parse_expression()?);
19                let span = self.create_span_from_tokens();
20                elements.push(Some(Node::SpreadElement(SpreadElement {
21                    argument,
22                    span: Some(span),
23                })));
24            } else {
25                elements.push(Some(self.parse_expression()?));
26
27                if self.check(TokenKind::Comma) {
28                    self.advance();
29                }
30            }
31        }
32
33        self.expect(TokenKind::RightBracket)?;
34
35        let span = self.create_span_from_tokens();
36        Ok(Node::ArrayLiteral(ArrayLiteral {
37            elements,
38            span: Some(span),
39        }))
40    }
41}